package collection_try;

import java.util.*;

public class MapHashTest {

    // map里面存放List的样例。
    public int equalPairs(int[][] grid) {
        int n = grid.length;
        Map<List<Integer>,Integer> map = new HashMap<List<Integer>,Integer>();
        for (int[] ints : grid) {
            List<Integer> row = new ArrayList<>();
            for (int j = 0; j < n; j++) {
                row.add(ints[j]);
            }
            int val = map.getOrDefault(row, 0) + 1;
            map.put(row, val);
        }
        int cnt=0;
        for(int i=0;i<n;i++){
            List<Integer> col = new ArrayList<>();
            for (int[] ints : grid) {
                col.add(ints[i]);
            }
            if(map.containsKey(col)){
                cnt+=map.get(col);
            }
        }
        return cnt;
    }


    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        System.out.println("测试一下对同一个key赋值，put()方法的返回值");
        System.out.println("put(\"one\", 3)返回值："+map.put("one", 3));
        System.out.println("put(\"one\", 2)返回值："+map.put("one", 2));
        System.out.println("put(\"one\", 1)返回值："+map.put("one", 1));
        System.out.println("对同一个key，one设置3个值，只会保留最后一个，一个键映射一个值，重复赋值会替换："+map);
        map.put("two",2);
        map.put("three",3);
        map.put("four",4);
        System.out.println("map集合初始化完成（会按照key的hash排序）："+map);
        System.out.println();
        System.out.println("通过get('one')获取one对应的值："+map.get("one"));
        System.out.println("当前map的大小："+map.size());
        System.out.println("keySet()获取所有key，Set<K>对象："+map.keySet());
        System.out.println("values()获取所有映射值Collection对象："+map.values());
        System.out.println();
        System.out.println("map1.equals(map2):判断两个map的映射关系，是否一致："+map.equals(map));
        System.out.println("isEmpty()判断集合是否为空："+map.isEmpty());
        System.out.println("map.containsKey(\"one\"):判断集合中是否包含key值one的映射："+map.containsKey("one"));
        System.out.println("map.containsValue(1):判断1这个值，是否和map中某个或某些key映射："+map.containsValue(1));
        System.out.println("下面是删除的方法：");
        Map<String,Integer> mapCopy = new HashMap<>(Map.of());
        mapCopy.putAll(map);
        System.out.println("remove(\"one\")：删除指定key，one，返回它映射的值（key丢失，1这个值没有引用指向，也会被GC回收）："+mapCopy.remove("one"));
        System.out.println("remove(\"two\", 3):删除指定key-value对，不满足映射关系，不删除："+mapCopy.remove("two", 3));
        System.out.println("删除后mapCopy："+mapCopy);
        mapCopy.clear();
        System.out.println("map.clear()清空mapCopy："+mapCopy);
        System.out.println();
//        map.put("one", 1);map.put("two",2);map.put("three",3);map.put("four",4);
        // 空测试： key由于hash只能一个null，value可以很多null。
        Map<String,String> nullMap = new HashMap<>();
        nullMap.put(null,"这里是null");
        nullMap.put(null,"这里是null_real");
        System.out.println(nullMap);
        nullMap.put("null1",null);
        nullMap.put("null2",null);
        nullMap.put("null3",null);
        System.out.println(nullMap);



        System.out.print("配合keySet()方法遍历key值:===>>[");
        Set<String> keySet = map.keySet();
        for(String s:keySet){
            System.out.print(s+", ");
        }
        System.out.println("]");

        System.out.print("配合keySet()和get()方法遍历key和value:===>>{");
        for(String s:keySet){
            System.out.print(s+"="+map.get(s)+", ");
        }
        System.out.println("}");

        System.out.print("配合values()方法遍历value值:===>>[");
        Collection<Integer> values = map.values();
        for(Integer i : values){
            System.out.print(i+", ");
        }
        System.out.println("]");

        System.out.print("配合entrySet()方法，同时遍历key和value值:===>>{");
        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        for (Map.Entry<String, Integer> entry : entries) {
            System.out.print(entry.getKey()+"="+entry.getValue()+", ");
        }
        System.out.println("}");

//        TreeMap底层就是一棵红黑树。
//        LinkedHashMap是HashMap的直接子类，二者唯一的区别是LinkedHashMap在HashMap的基础上，采用双向链表(doubly-linked list)的形式将所有entry连接起来。

    }
}
